#include <stdlib.h>
#include <string.h>


// 泛型编程：General Program，简称 GP，实现与具体数据类型无关的编程处理。


// 本函数可以对任意类型的数组进行任意的排序处理
void quick_sort(void *base, size_t nmemb, 
            size_t size, int (*compar)(const void *, const void *))
{
    int i = 0, j = nmemb - 1;
    void* k = NULL;

    if(nmemb <= 1) return;

    k = malloc(size);
    memcpy(k, base, size);

    while(i < j)
    {
        while(i < j && compar(k, base + j * size) <= 0) j--;

        memcpy(base + i * size, base + j * size, size);

        while(i < j && compar(k, base + i * size) >= 0) i++;

        memcpy(base + j * size, base + i * size, size);
    }

    memcpy(base + j * size, k, size);
    free(k);

    quick_sort(base, i, size, compar);
    quick_sort(base + (i + 1) * size, nmemb - i - 1, size, compar);
}
